#U okviru ove lekcije daćemo detaljninnji prikaz bitnijih izvedenih struktura podataka koji se
#nalaze u okviru programskog paketa Julia.
#NIZOVI
#Nizovi predstavljaju uredjenu strukturu podataka ne obavezno istog tipa kod kojih za svaki element u nizu postoji
#tačno određeno mesto u nizu kome on pripada tj. postoji uređenost elemenata niza. Kod njih indeksiranje kreće od
#broja 1
niz_primer1 = [1, 3, 5]; #niz kod koga su svi elementi istog tipa
niz_primer2 = [1, "jabuka", 5.6]; #niz u kome imamo elemente različitih tipova
#Definisanje nizova
#Ukoliko želimo da imamo niz kome unapred znamo vrednosti, kao i koje su to vrednosti, njega možemo definisati
#prostom naredbom uvođenja promenljive gde će sa leve strane operatora dodele vrednosti stajati ime promenljive kojoj
#dodeljujemo naš niz, a sa desno strane će stajati izraz koji je ograničen uglastim zagradama, gde će se element po
#element niza navoditi, medjusobno razdvojeni zapetama. Na primer:
niz_primer3 = [1, 3.5, 1000 , 500]
#Sintaksa definisanja neinicijalizovanih nizova dobija se na sledeći način:
#Izraz sa leve strane operatora dodele predstavlja kao
#i do sad promenljivu kojoj dodeljujemo naš niz. Izraz sa desne strane predstavlja kombinaciju sintaksnih elemenata
#koji služe za definisanje osobina našeg niza, pa generalna forma za definisanje sledećeg niza ima sledeću formu:
#array = Array{DataType}(undef, dim1, dim2, ..., dimN) - DataType predstavlja tip podataka koji želimo da smeštamo
#u naš niz , dok dim1, dim2, ..., dimN predstavlja brojeve elemenata koji će se nalaziti u odgovarajućim dimenzijama
#našeg niza - kao rezultat dobijamo niz čiji će elementi biti slučajno izabrani
#Primer:
niz_primer4 = Array{Int32}(undef,2,2)
#Takođe, moguće je definisati i prazan niz, koji posle služi za neke dalje obrade
niz_primer5 = []
#MATRICE
#Matrice predstavljaju dvodimenzionalne nizove, kao i jednu od najvažnijih matematičkih struktura u obradi podataka.
#To je pravougaona šema brojeva, dimenzija m x n, gde m predstavlja broj vrsta naše matrice, a n broj njenih kolona.
#Ovo se može interpretirati na sledeći način: Matrica formata m x n predstavlja m nizova dužine n poređanih po nekom
#poretku, gde je svaki od nizova dužine n.
#U programskom jeziku Julia, matrice se definišu na sledeći način: redom po vrstama navodimo elemente naše matrice.
#Primenom operatora ; vršimo prelazak u novi red. U tom slučaju, ovde ne možemo imati operator zapete koji bi
#vršio razdvajanje elemenata matrice
matrica_primer1 = [1 4; 1000 2000]
#Za sad ćamo dati prikaz kreiranja nekih specijalnih nizova i matrica, ali ovde neće biti kraj priče o nizovima.
#U toku kasnijih lekcija vraćaćemo se na nizove, što zato što su nam onu potrebni za realizaciju nekih drugih
#funkcionalnosti, što jer još uvek nismo uveli neke druge jezičke strukture za rad sa njima (npr. petlje)
#Kreiranje niza i matrice koji se sastoje od svih 0
niz_nule = zeros(1,1000); #niz dužine 1000 koji sadrži sve 0
matrica_nule = zeros(4,2); #matrica sa 4 vrste i 2 kolone koja sadrži sve 0
#Kreiranje niza i matrice koji se sastoje od svih 1
niz_jedinice = ones(1,1000); #niz dužine 1000 koji sadrži sve 1
matrica_jedinice = ones(4,2); #matrica sa 4 vrste i 2 kolone koja sadrži sve 1
println("niz_nule: "); print(niz_nule); println("");
println("niz_jedinice: "); print(niz_jedinice); println("");
println("matrica_nule: "); print(matrica_nule); println("");
println("matrica_jedinice: "); print(matrica_jedinice); println("");
#Konacno, generisaćemo niz i matricu kod kojih su elementi niza slučajne promenljive sa uniformnom raspodelom
#od 0 do 1.
niz_unif = rand(1,1000); #niz dužine 1000 koji sadrži brojeve koji su realizacije slučajne promenljive
#sa unif raspodelom na integrvalu od 0 do 1
matrica_unif = rand(4,2); #matrica sa 4 vrste i 2 kolone koji su realizacije slučajne promenljive
#sa unif raspodelom na integrvalu od 0 do 1
println("niz_unif: "); print(niz_unif); println("");
println("matrica_unif: "); print(matrica_unif); println("");
#TORKE
#Torke su struktura podataka koji su veoma slični nizovima, međutim postoje neke značajne razlike. Prva i najvažnija
#razlika jeste ta da su koordinate torki nepromenljive, što kod nizova nije slučaj. Druga razlika je sintaksne
#prirode: torke se označavaju običnim zagradama i njene koordinate moraju biti odvojene zapetom. Indeksiranje
#počinje od 1.
#Primer jedne torke:
torka_primer1 = tuple(4, 10, 55)
#Možemo vršiti pristup tačno jednom elementu torke ili elementima torke čiji indeksi pripadaju određenim opsezima:
torka_primer1 = tuple(4, 10, 55, 800, 890, 90000);
println("Element torke na poziciji 3 je: ",torka_primer1[3])
println("Elementi torke počev od pozicije 3 su: ",torka_primer1[3:end])
#SKUPOVI
#Skupovi u programskim jezicima predstavljaju sastav od vise elemenata, koji su jedinstveni, i kod kojih poredak
#nije bitan.
#Skup se može formirati na sledeći način:
skup_kategorija = Set{String}(["prva","druga","treća"])
# Sa nizovima možemo vršiti različite operacije. One koje su nam od najvećeg značaja jesu operacija pripadnosti nekog
#elementa našem skupu, kao i osnovne skupovne operacije unije, preseka i razlike:
#pripadnost skupu
in("druga", skup_kategorija), #operator , se može koristiti za ispisivanje rezultata više redova koji nisu
in("cetvrta", skup_kategorija) # zatvoreni sa ; u jednoj torci, redom kojim su navedeni
kategorije2_skup = Set{String}(["prva","peta","treća"]);
#presek
intersect(skup_kategorija, kategorije2_skup)
#unija
union(skup_kategorija, kategorije2_skup)
#razlika
setdiff(skup_kategorija, kategorije2_skup)